home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / dev / e / Chris_emods.lha / progresswin.e < prev    next >
Text File  |  1997-08-26  |  6KB  |  211 lines

  1. OPT MODULE, PREPROCESS, REG = 5
  2.  
  3. MODULE '*screens'
  4.  
  5. MODULE 'intuition/intuition'
  6. MODULE 'intuition/screens'
  7. MODULE 'utility/tagitem'
  8.  
  9. MODULE 'gadtools'
  10. MODULE 'libraries/gadtools'
  11. MODULE 'graphics/rastport'
  12. MODULE 'graphics/gfxmacros'
  13.  
  14. MODULE 'graphics/text'
  15. MODULE 'diskfont'
  16.  
  17. EXPORT OBJECT progresswin PRIVATE
  18.   win:PTR TO window
  19.   rp:PTR TO rastport
  20.   scr:PTR TO screen
  21.   dri:PTR TO drawinfo
  22.   vis
  23.   tf:PTR TO textfont
  24.   wrmsk
  25.  
  26.   windowdim[4]:ARRAY OF INT
  27.   progressgaddim:PTR TO LONG
  28.  
  29.   currpercent:INT
  30. ENDOBJECT
  31.  
  32. PROC lockprogressscreen(pw:PTR TO progresswin, screenname) HANDLE
  33.   pw.scr := LockPubScreen(screenname)
  34.   IF pw.scr = NIL THEN Throw("PUBS", screenname)
  35.  
  36.   pw.dri := GetScreenDrawInfo(pw.scr)
  37.   IF pw.dri = NIL THEN Raise("DRI")
  38.  
  39.   pw.vis := GetVisualInfoA(pw.scr, NIL)
  40.   IF pw.vis = NIL THEN Raise("VIS")
  41. EXCEPT
  42.   unlockprogressscreen(pw)
  43. ENDPROC
  44.  
  45. PROC unlockprogressscreen(pw:PTR TO progresswin)
  46.   IF pw.vis THEN FreeVisualInfo(pw.vis)
  47.   IF pw.dri THEN FreeScreenDrawInfo(pw.scr, pw.dri)
  48.   IF pw.scr THEN UnlockPubScreen(NIL, pw.scr)
  49. ENDPROC
  50.  
  51. EXPORT PROC openprogresswin(pw:PTR TO progresswin, scrname, win2ptr:PTR TO window, progressstr) HANDLE
  52.   DEF winptr = NIL:PTR TO window
  53.  
  54.   IF findpubscreen(scrname)
  55.     lockprogressscreen(pw, scrname)
  56.   ELSE
  57.     lockprogressscreen(pw, NIL)
  58.   ENDIF
  59.  
  60.   pw.tf := OpenDiskFont([pw.scr.font.name,
  61.                          pw.scr.font.ysize,
  62.                          pw.scr.font.style,
  63.                          FPF_ROMFONT OR FPF_DISKFONT]:textattr)
  64.   IF pw.tf = NIL THEN Raise("FONT")
  65.  
  66.   pw.windowdim[2] := 250
  67.   pw.windowdim[3] := pw.tf.ysize * 6
  68.   IF win2ptr
  69.     pw.windowdim[0] := win2ptr.leftedge + (win2ptr.width  / 2) - (pw.windowdim[2] / 2)
  70.     pw.windowdim[1] := win2ptr.topedge  + (win2ptr.height / 2) - (pw.windowdim[3] / 2)
  71.   ELSE
  72.     pw.windowdim[0] := (pw.scr.width  / 2) - (pw.windowdim[2] / 2)
  73.     pw.windowdim[1] := (pw.scr.height / 2) - (pw.windowdim[3] / 2)
  74.   ENDIF
  75.  
  76.   IF (winptr := OpenWindowTagList(NIL,
  77.       [WA_LEFT,       pw.windowdim[0],
  78.        WA_TOP,        pw.windowdim[1],
  79.        WA_WIDTH,      pw.windowdim[2],
  80.        WA_HEIGHT,     pw.windowdim[3],
  81.        WA_BORDERLESS, TRUE,
  82.        WA_AUTOADJUST, TRUE,
  83.        TAG_DONE])) = NIL THEN Raise("WIN")
  84.  
  85.   pw.win   := winptr
  86.   pw.rp    := winptr.rport
  87.   pw.wrmsk := winptr.rport.mask
  88.  
  89.   SetFont(pw.rp, pw.tf)
  90.   SetBPen(pw.rp, pw.dri.pens[BACKGROUNDPEN])
  91.   SetDrMd(pw.rp, RP_JAM1)
  92.   SafeSetWriteMask(pw.rp, $03)
  93.  
  94.   drawprogresswin(pw)
  95.   drawprogresstext(pw, progressstr)
  96. EXCEPT
  97.   closeprogresswin(pw)
  98. ENDPROC
  99.  
  100. EXPORT PROC closeprogresswin(pw:PTR TO progresswin)
  101.   IF pw.tf  THEN CloseFont(pw.tf)
  102.   IF pw.win
  103.     pw.rp.mask := pw.wrmsk
  104.     CloseWindow(pw.win)
  105.     pw.win := NIL
  106.   ENDIF
  107.   unlockprogressscreen(pw)
  108. ENDPROC
  109.  
  110. PROC drawprogresswin(pw:PTR TO progresswin)
  111.   DEF oldfill
  112.  
  113.   IF pw.win
  114.     /* Draw dither fill */
  115.  
  116.     oldfill := pw.rp.areaptrn
  117.     SetAPen(pw.rp, pw.dri.pens[SHINEPEN])
  118.     SetAfPt(pw.rp, [%1010101010101010, %0101010101010101]:INT, 1)
  119.     RectFill(pw.rp, 0, 0, pw.windowdim[2], pw.windowdim[3])
  120.     pw.rp.areaptrn := oldfill
  121.  
  122.     /* Draw bevel */
  123.  
  124.     DrawBevelBoxA(pw.rp,
  125.                   0, 0, pw.windowdim[2], pw.windowdim[3],
  126.                   [GT_VISUALINFO, pw.vis])
  127.     DrawBevelBoxA(pw.rp,
  128.                   5, 5, pw.windowdim[2] - 10, pw.windowdim[3] - 10,
  129.                   [GT_VISUALINFO, pw.vis,
  130.                    GTBB_RECESSED])
  131.  
  132.     /* Fill middle */
  133.  
  134.     SetAPen(pw.rp, pw.dri.pens[BACKGROUNDPEN])
  135.     RectFill(pw.rp, 6, 6, pw.windowdim[2] - 7, pw.windowdim[3] - 7)
  136.  
  137.     /* Gadget */
  138.  
  139.     pw.progressgaddim := [20,                   pw.windowdim[3] / 2,
  140.                           pw.windowdim[2] - 40, pw.tf.ysize + 6]
  141.  
  142.     DrawBevelBoxA(pw.rp,
  143.                   pw.progressgaddim[0], pw.progressgaddim[1],
  144.                   pw.progressgaddim[2], pw.progressgaddim[3],
  145.                   [GT_VISUALINFO, pw.vis,
  146.                    GTBB_RECESSED])
  147.   ENDIF
  148. ENDPROC
  149.  
  150. EXPORT PROC drawprogresstext(pw:PTR TO progresswin, string)
  151.   DEF textext:textextent, fit
  152.  
  153.   /* Text */
  154.  
  155.   SetAPen(pw.rp, pw.dri.pens[BACKGROUNDPEN])
  156.   RectFill(pw.rp, 10,                   (pw.windowdim[3] / 3) - pw.tf.baseline,
  157.                   pw.windowdim[2] - 11, (pw.windowdim[3] / 3) - pw.tf.baseline + pw.tf.ysize)
  158.  
  159.   SetAPen(pw.rp, pw.dri.pens[TEXTPEN])
  160.   Move(pw.rp, Max(10, (pw.windowdim[2] / 2) - (TextLength(pw.rp, string, StrLen(string)) / 2)), (pw.windowdim[3] / 3) )
  161.   IF (fit := TextFit(pw.rp,              string,
  162.                      StrLen(string), textext,
  163.                      NIL,                1,
  164.                      pw.windowdim[2] - 11 - pw.rp.cp_x,
  165.                      pw.scr.font.ysize)) > 0 THEN Text(pw.rp, string, fit)
  166. ENDPROC
  167.  
  168. EXPORT PROC drawprogressgad(pw:PTR TO progresswin, percentage)
  169.   DEF fillpos, percentstr[512]:STRING
  170.   DEF textext:textextent, fit
  171.  
  172.   IF pw.win
  173.  
  174.     /* If the percent is the same as before, don't draw anything */
  175.  
  176.     IF (percentage <> pw.currpercent)
  177.       pw.currpercent := percentage
  178.  
  179.       fillpos := (((pw.progressgaddim[2] - 5) * percentage) / 100)
  180.  
  181.       /* Draw filled part */
  182.  
  183.       SetAPen(pw.rp, pw.dri.pens[FILLPEN])
  184.       RectFill(pw.rp, pw.progressgaddim[0] + 4,
  185.                       pw.progressgaddim[1] + 2,
  186.                       pw.progressgaddim[0] + fillpos,
  187.                       pw.progressgaddim[1] + pw.progressgaddim[3] - 3)
  188.  
  189.       /* Clear empty part */
  190.  
  191.       SetAPen(pw.rp, pw.dri.pens[BACKGROUNDPEN])
  192.       RectFill(pw.rp, pw.progressgaddim[0] + 4 + fillpos + 1,
  193.                       pw.progressgaddim[1] + 2,
  194.                       pw.progressgaddim[0] + 4 + pw.progressgaddim[2] - 9,
  195.                       pw.progressgaddim[1] + pw.progressgaddim[3] - 3)
  196.  
  197.       /* Draw percent on the middle of the gadget */
  198.  
  199.       StringF(percentstr, '\d%', percentage)
  200.  
  201.       SetAPen(pw.rp, pw.dri.pens[TEXTPEN])
  202.       Move(pw.rp, (pw.windowdim[2] / 2) - (TextLength(pw.rp, percentstr, EstrLen(percentstr)) / 2), pw.progressgaddim[1] + 2 + pw.tf.baseline)
  203.       IF (fit := TextFit(pw.rp,               percentstr,
  204.                          EstrLen(percentstr), textext,
  205.                          NIL,                 1,
  206.                          pw.windowdim[2] - 11 - pw.rp.cp_x,
  207.                          pw.scr.font.ysize)) > 0 THEN Text(pw.rp, percentstr, fit)
  208.     ENDIF
  209.   ENDIF
  210. ENDPROC
  211.